define(['director', 'util', 'knockout','config'], function (Router, Util, ko,Config) {
    var lastHash = '';
    var gotoTop = false;
    var router = Router().configure({
        notfound: function () {
            var maxLevel = Util.getHashMaxLevel();

            if(maxLevel > Config.route.maxLevel) {
                maxLevel = Config.route.maxLevel;
            }

            for(var levelIndex = 1; levelIndex<= maxLevel; ++levelIndex){
                var cmp = Util.getCmpFromHash(levelIndex);
                var order1Cmp = '{0}Cmp'.formatTpl(Config.route.order[levelIndex]);
                var order2Cmp = '{0}Cmp'.formatTpl(Config.route.order[levelIndex+1]);
                var oldCmp = ko.mapping.toJS(ko.root[order1Cmp]);

                var oldParams = $.extend({},oldCmp.params);
                var newParams = $.extend({},cmp.params);

                delete oldParams['_'];
                delete newParams['_'];

                var tempHash = '{0}_{1}_lv_{2}'.formatTpl(cmp.name,JSON.stringify(newParams),levelIndex);

                if ((!(oldCmp.name == cmp.name&&JSON.jsEqual(oldParams, newParams)) || maxLevel == levelIndex)&&lastHash!=tempHash) {
                    lastHash = tempHash;
                    console.log('lv{0}'.formatTpl(levelIndex),oldCmp, cmp);
                    //ko.root[order1Cmp](Config.koTemplate.emptyCmp);
                    // Util.delay({timeout:5,callback:function () {
                    ko.root[order1Cmp].name(cmp.name);
                    ko.root[order1Cmp].params(cmp.params);
                    //  }
                    // });

                    if(ko.root[order2Cmp]) {
                        ko.root[order2Cmp].name(Config.koTemplate.emptyCmp.name);
                        ko.root[order2Cmp].params(Config.koTemplate.emptyCmp.params);
                    }
                }
            }


            // if (maxLevel > 0) {
            //     var cmpL1 = Util.getCmpFromHash(1);
            //
            //     if (!JSON.jsEqual(ko.root.mainCmp(), cmpL1) || maxLevel == 1) {
            //         console.log('lv1',ko.root.mainCmp(), cmpL1);
            //         ko.root.mainCmp(cmpL1);
            //         ko.root.secondCmp({name: 'cmp:Empty', params: undefined});
            //     }
            //
            // }
            //
            // if (maxLevel > 1) {
            //     var cmpL2 = Util.getCmpFromHash(2);
            //
            //     if (!JSON.jsEqual(ko.root.secondCmp(), cmpL2)) {
            //         console.log('lv2',ko.root.secondCmp(), cmpL2);
            //         ko.root.secondCmp(cmpL2);
            //         ko.root.thirdCmp({name: 'cmp:Empty', params: undefined});
            //     }
            // }
            //
            // if(maxLevel >2 ) {
            //     var cmpL3 = Util.getCmpFromHash(3);
            //
            //     if (!JSON.jsEqual(ko.root.thirdCmp(), cmpL3)) {
            //         console.log('lv3',ko.root.thirdCmp(), cmpL3);
            //         ko.root.thirdCmp(cmpL3);
            //     }
            // }
        }
    });

    return {
        init: function (params) {
            router.init();

            if(params&&params.gotoTop) gotoTop = params.gotoTop;
        },
        destroy: function () {
            router.destroy();
            location.hash = lastHash  = '';
        },
        back:function(){
            window.history.back(-1);

            if(gotoTop) Util.gotoTop();
        },
        routeTo:function (data) {
            var tempHash = data.hash;

            data.params = $.extend({'_':Util.uuid(4,16)},data.params);

            if(data.params) tempHash = '{0}&{1}'.formatTpl(data.hash,JSON.js2Uri(data.params));

            location.hash = tempHash;

            if(gotoTop) Util.gotoTop();
        }
    };
});
